﻿namespace PLCS.SocialHttpClient.Test.Models
{
    // 客户端上报机器人状态
    public class RobotDto
    {
        // 机器人编号
        public uint id { get; set; }

        // 基础信息中的别名, 方便显示
        public string alias { get; set; }

        // 运行状态, 由健康状态+充电状态+任务状态联合生成
        public RunState run_state { get; set; }

        public string run_state_str { get; set; }

        // 导航状态
        public NavState nav_state { get; set; }

        public string nav_state_str { get; set; }

        // 任务状态
        public ulong mission_id { get; set; }

        public MissionState mission_state { get; set; }
        public string mission_err_msg { get; set; }

        // 路径经过点
        public uint last_spot_id { get; set; }

        public uint next_spot_id { get; set; }
        public string last_spot_name { get; set; }
        public string next_spot_name { get; set; }

        // 状态更新时间戳
        public long update_stamp { get; set; }

        /* 导航相关状态 range 21-30 */

        // 机器人位置/速度
        public string map_name { get; set; }

        public double x { get; set; }
        public double y { get; set; }
        public double theta { get; set; }
        public double linear_speed { get; set; }
        public double angular_speed { get; set; }

        /* 硬件状态 range 31-40 */

        // 防撞条是否触发/锁死
        public bool cbar { get; set; }

        // 电机是否使能/急停按钮是否按下
        public bool stop_btn { get; set; }

        // 电池电量
        public float battery { get; set; }

        // 电池温度
        public float battery_temp { get; set; }
    }

    public enum MissionState
    {
        // 排队中, 等待开始
        PENDING = 0,

        // 执行中
        RUNNING = 1,

        // 步骤专用, 暂停等待服务端, 可以响应取消、继续指令
        HOLD_WAITING = 2,

        // 步骤专用, 出错后等待人工处理, 可以响应取消、跳过、重试指令
        FAIL_WAITING = 3,

        // 取消中
        CANCELING = 4,

        // 正常完成 (可以通过比较大小看是否完成的分界线)
        FINISHED = 5,

        // 取消完成
        CANCELED = 6,

        // 出错终止
        ABORTED = 7
    };

    // 导航状态, 底层算法上报的状态
    public enum NavState
    {
        // 无导航任务
        IDLE = 0,

        // 导航行走中
        NAV_LOCALIZED = 1,

        // 盲走中
        NAV_ODOMETRY = 2,

        // 停障中
        STOP_OBSTACLE = 3,

        // 交管停车中
        STOP_TRAFFIC = 4,

        // 伺服对接中, 通用, 不知道啥对接时用. 例如充电桩、辊筒对接
        SERVOING = 5,

        // 激光伺服中
        SERVOING_LASER = 6,

        // 顶部相机视觉伺服对接货架中
        SERVOING_VISUAL_UPPER = 7,

        // 底部相机视觉伺服对接二维码中
        SERVOING_VISUAL_BOTTOM = 8,

        // 视觉巡线
        SERVOING_LINE_FOLLOW = 9
    };

    // 机器人总体状态
    // 就绪: 正常
    // 忙碌: 正常
    // 充电: 不往下发任务, 不请求/接受任务(拒绝所有任务)
    // 故障: 不往下发任务, 不请求/接受任务(拒绝所有任务)
    // 调试: 不请求任务(拒绝服务端任务)
    public enum RunState
    {
        // 维护/启动中
        ST_INIT = 0,

        // 就绪, 可以执行任务
        ST_READY = 1,

        // 忙碌, 有任务在运行
        ST_BUSY = 2,

        // 充电中, 当机器人充电时, 如果满足了接受任务条件则为就绪态
        ST_CHARGING = 3,

        // 故障中, 需要人工介入处理
        ST_FAILURE = 4
    };

    /* 基本状态信息 range 1-20 */
}